先來複習一下,昨天,我們提到了類別(class)
與實體(instance)
,Ruby藉由實例化類別形成物件,並透過方法(method)
來表現行為或與其他物件互動。今天,我們就來認識一下 方法(method) 是什麼。
起手式:在 Ruby ,我們使用def...end
來命名,通常是以英文小寫命名,如果名稱超過一個單詞則用底線連接。
class Note
def clean_schedule
puts "9:00 do the laundry"
end
end
有些方法在使用或被使用的對象不同,需要帶入不同條件,我們會用傳入參數(parameter)
的方式來執行,而參數可以有1個以上。
class Note
def clean_schedule(day)
puts "#{day} 9:00 do the laundry"
end
end
Note.new.clean_schedule("Sunday") # Sunday 9:00 do the laundry
此外,我們可以在定義方法時給定參數的預設值,呼叫方法時沒有帶入參數,就會使用預設值,有帶入參數,就使用帶入的參數。
class Note
def clean_schedule(day = 'Sunday')
puts "#{day} 9:00 do the laundry"
end
end
Note.new.clean_schedule # Sunday 9:00 do the laundry
Note.new.clean_schedule("Friday") # Friday 9:00 do the laundry
方法綁定於類別本身而非類別的實例的方法,意思是當接收者不是物件而是類別本身時。要定義一個類別方法,需要在方法名稱前面加上self
。
class Product
# 類別方法,建立一個新產品
def self.create_product(name, price)
puts "The #{name} is #{price}."
end
end
Product.create_product("book", 300) # The book is 300.
另一種定義方式是使用def class << self...end
,將self
方法加到類別裡。
class Product
# 類別方法,建立一個新產品
def class << self
def create_product(name, price)
puts "The #{name} is #{price}."
end
end
end
Product.create_product("book", 300) # The book is 300.
需要一個與類別相關的方法,而不需要存取類別的實例變數或方法時。這些方法通常用於執行一些操作,例如計算或轉換,而不需要實例化類別。
綁定於類別實例的方法,當接收者是物件時,類別被new成物件後使用的方法。
class Product
attr_accessor :name, :price
def initialize(name, price)
@name = name
@price = price
end
def on_sale
puts "The product is 80% off."
end
end
# 使用類別建立產品實體
product = Product.new('cake', 199)
puts "Product: #{product.name}, Price: $#{product.price}" # "Product: cake, Price: 199"
puts product.on_sale # "The product is 80% off."
我們可以用類別的角度來思考,一個類別可以從兩個管道使用方法
extend
模組(module) 的方法,成為本身可調用類別方法(class method)
; include
模組(module) 的方法,成為本身可調用實體方法(instance method)
。self
方法。類別的物件實體,用自己類別裡定義的實體方法(instance method)
。參考資料: